import configparser

# 获取配置文件类 class
# ConfigParser & RawConfigParser  不同 区别
"""
一、区别
1、ConfigParser()类是configparser模块的旧版本，它提供了一些额外的特性，如对配置文件中的值进行插值替换。
当使用ConfigParser()类解析配置文件时，它会自动进行值的替换。例如，如果配置文件中的一个值是${section:key}，它会自动查找相应的section和key，并将其值替换到${section:key}的位置。
ConfigParser()类还提供了一些方法来获取和设置配置文件中的值，如get()、set()等。

2、RawConfigParser()类是configparser模块的新版本，它不进行任何值的替换或插值操作。
当使用RawConfigParser()类解析配置文件时，它会将配置文件中的值原样返回，不进行任何处理。
RawConfigParser()类也提供了类似的方法来获取和设置配置文件中的值，如get()、set()等。
PS：在Python3中，ConfigParser()类实际上是对RawConfigParser()类的别名，它们是同一个类。这是为了向后兼容性而保留的。因此，在新的代码中，建议使用RawConfigParser()类来解析配置文件，以避免混淆。
SafeConfigParser()是Python2的，不适用于Python3

二、注意事项
注意，如果键值内容包含%，用ConfigParser()会有问题，解决办法：
1、键值内容将%改为%%
2、改用RawConfigParser()。另外，假设键值="abc%def" ，RawConfigParser()读取字符串时，会把双引号也当成字符串组成部分
"""
class RwConfig:
    def __init__(self, path):
        # print(path)
        # print(f"__init__: [{self},{path}]")
        self.cf = configparser.RawConfigParser()
        # print(f"self.cf: [{self.cf}]")
        self.path = path  # 可以多个文件读写
        # print(f"self.path: [{self.path}]")
        self.cf.read(self.path)  # 读取配置文件，此处默认encoding='utf-8'   如果报错可使用  encoding='utf-8'
        # print('type(self.cf):', type(self.cf))
        # print(path, self.cf)

    def Get_All(self):
        All = ""
        # print(f"All函数: [{All},{self}]")
        for section in self.cf.sections():  # 获取所有的section名
            # print(f"[{section}]")  # 打印section名
            for option in self.cf.options(section):  # 获取该section下的所有option名
                # print(f"{option} = {self.cf[section][option]}")
                All += f"{option} = {self.cf[section][option]}\n"  # 打印option名和值
        return All

    def Get_Config(self, section=None, option=None):
        # print(f"Get_Config函数参数: [{section},{option}]")
        try:
            value = self.cf.get(section, option)
            # print(value)
            return value
        except configparser.NoSectionError:
            print("Section {} not exist".format(section))
            return "Section {} not exist".format(section)
        except configparser.NoOptionError:
            print("option {} not exist in section {}".format(option, section))
            return "option {} not exist in section {}".format(option, section)

    def Get_Config_Int(self, section=None, option=None):
        try:
            value_int = self.cf.getint(section, option)
            # print(value_int)
            return value_int
        except configparser.NoSectionError:
            print("Section {} not exist".format(section))
            return "Section {} not exist".format(section)
        except configparser.NoOptionError:
            print("option {} not exist in section {}".format(option, section))
            return "option {} not exist in section {}".format(option, section)

    def Get_Config_Boolean(self, section=None, option=None):
        try:
            value_boolean = self.cf.getboolean(section, option)
            # print(value_boolean)
            return value_boolean
        except configparser.NoSectionError:
            print("Section {} not exist".format(section))
            return "Section {} not exist".format(section)
        except configparser.NoOptionError:
            print("option {} not exist in section {}".format(option, section))
            return "option {} not exist in section {}".format(option, section)

    def Set_Config(self, section, option, param):
        # print('self.path:', self.path)
        if not self.cf.has_section(section):
            self.cf.add_section(section)  # 如果 section 不存在，则创建
        self.cf.set(section, option, param)  # 如果 option 不存在，则创建，存在则修改
        self.cf.write(open(self.path, "w"))
        # print("Set configparser success for section = [{}], option = [{}], param = [{}]".format(section, option, param))
        return "Set configparser success for section = [{}], option = [{}], param = [{}]".format(section, option, param)

    def Remove_Config(self, section=None, option=None):
        if (self.cf.has_section(section)) and (option):
            self.cf.remove_option(section, option)
            self.cf.write(open(self.path, "w"))
            print("remove configparser success for section = [{}], option = [{}]".format(section, option))
            return "remove configparser success for section = [{}], option = [{}]".format(section, option)
        elif self.cf.has_section(section) and (not option):
            self.cf.remove_section(section)
            self.cf.write(open(self.path, "w"))
            print("remove configparser success for section = [{}]".format(section))
            return "remove configparser success for section = [{}]".format(section)
        else:
            print("Section {} not exist".format(section))
            return "Section {} not exist".format(section)

